package com.hzqiuxm.tdddemo001.junit5demo.testtemplate;

import org.junit.jupiter.api.extension.*;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;

/**
 * Copyright © 2021年 tdd-demo-001. All rights reserved.
 *
 * @author 临江仙 hzqiuxm@163.com
 * 自己定义的一个测试用例模板
 * 模板主要功能：验证传进来的水果名称
 * @date 2021/2/4 23:24
 */
public class MyTemplate implements TestTemplateInvocationContextProvider {

    /**
     * 判断是否支持该测试模板，一般设置为true即可
     * 除非是多个相似模板，不确定调用哪个时，可以根据实际场景进行具体判断
     * @param context 上下文
     * @return true
     */
    @Override
    public boolean supportsTestTemplate(ExtensionContext context) {
        return true;
    }

    /**
     * 模板逻辑核心方法
     * @param context 上下文
     * @return
     */
    @Override
    public Stream<TestTemplateInvocationContext> provideTestTemplateInvocationContexts(ExtensionContext context) {
        //注意，这里有多少个参数，测试方法就会被执行多少次
        return Stream.of(InvocationContext("apple"),InvocationContext("orange"));
    }

    /**
     *
     * @param fruit 水果名词
     * @return 测试模板调用上下文
     */
    private TestTemplateInvocationContext InvocationContext(String fruit) {
        return new TestTemplateInvocationContext(){

            @Override
            public String getDisplayName(int invocationIndex) {
                return fruit;
            }

            @Override
            public List<Extension> getAdditionalExtensions() {
                return Collections.singletonList(new ParameterResolver() {

                    @Override
                    public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
                            throws ParameterResolutionException {
                        //验证传递进来的水果名词必须是String类型
                        return parameterContext.getParameter().getType().equals(String.class);
                    }

                    @Override
                    public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
                            throws ParameterResolutionException {
                        //此处演示不做处理,直接原样返回
                        return fruit;
                    }
                });
            }
        };
    }
}
